﻿namespace Contoso.ActiveDirectory {

    #region Usings
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    #endregion

    /// <summary>
    /// For Exchange objects that are materialized as mailboxes.
    /// https://blogs.technet.com/b/exchange/archive/2006/10/13/3395089.aspx
    /// </summary>
    public interface IExchangeMailboxAttributes {

        string DatabaseName { get; }
        IExchangeActiveSyncDevices ExchangeActiveSyncDevices { get; }
        string HomeMDB { get; }
        string HomeMTA { get; }
        int MDBOverHardQuotaLimit { get; }
        int MDBOverQuotaLimit { get; }
        int MDBStorageQuota { get; }
        int MDBUnreadLimit { get; }
        bool MDBUseDefaults { get; }
        MSExchELCMailboxFlags MSExchELCMailboxFlags { get; }
        string MSExchHomeServerName { get; }

        /// <summary>
        /// http://msdn.microsoft.com/en-us/library/microsoft.exchange.data.directory.sync.directorypropertyname.msexchlitigationholddate%28v=exchg.140%29.aspx
        /// </summary>
        DateTime? MSExchLitigationHoldDate { get; }

        /// <summary>
        /// http://msdn.microsoft.com/en-us/library/microsoft.exchange.data.directory.sync.directorypropertyname.msexchlitigationholdowner%28v=exchg.140%29.aspx
        /// </summary>
        string MSExchLitigationHoldOwner { get; }
        Guid MSExchMailboxGuid { get; }
        MSExchMobileMailboxFlags MSExchMobileMailboxFlags { get; }
        MSExchangeOMAWirelessEnable MSExchOmaAdminWirelessEnable { get; }
        IReadOnlyList<string> MSExchOmaAdminExtendedSettings { get; }
        MSExchRemoteRecipientType MSExchRemoteRecipientType { get; }
        MSExchUserAccountControl MSExchUserAccountControl { get; }
        DateTime? MSExchWhenMailboxCreated { get; }
        IReadOnlyList<string> ProtocolSettings { get; }
        IReadOnlyList<string> PublicDelegates { get; }
        string ServerName { get; }

        void GetExchangeActiveSyncDevices(string dn);
        void ProcessResults(Dictionary<string, object[]> attributes);
    }
}
